package com.skilltrackedu.config;

import cn.hutool.core.util.StrUtil;


import com.skilltrackedu.constants.UserConstants;
import com.skilltrackedu.utils.UserContext;
import feign.Logger;
import feign.RequestInterceptor;
import feign.RequestTemplate;
import org.springframework.context.annotation.Bean;

/**
 * @author LENOVO
 * @version 1.0
 * @date 2025/4/16 22:11
 */
public class DefaultFeginConfig {

    /**
     * 配置Feign客户端的日志记录级别
     * <p>
     * 本方法选择性地返回不同的日志级别，以控制Feign客户端的日志输出
     * 不同级别解释：
     * - HEADERS：仅记录请求和响应的头信息
     * - NONE：不记录任何日志信息
     * - BASIC：记录简单的请求和响应信息（如方法、URL、状态码等）
     * - FULL：记录完整的请求和响应信息，包括头信息、请求体、元数据等
     *
     * @return Logger.Level 返回选定的日志级别，此处选择记录完整的日志信息
     */
    @Bean
    public Logger.Level feginLoggerLevel() {
        //不记录任何日志信息
        //return Logger.Level.NONE;

        //仅记录请求和响应的头信息
        //return Logger.Level.HEADERS;

        //记录简单的请求和响应信息（如方法、URL、状态码等）
        return Logger.Level.BASIC;

        //记录详细的请求和响应信息（如请求和响应头、请求和响应体等）
        //return Logger.Level.FULL;
    }


    /**
     * 配置用户信息请求拦截器
     *
     * 该方法用于创建并配置一个请求拦截器，该拦截器负责在OpenFegin发出请求到其他服务前
     * 将用户信息（用户ID和角色）从线程内存(common模块里的UserContext)中 添加到请求头中
     *
     * 这样保证服务之前的请求中会去网关已经存好用户信息的线程内存中获取用户信息并携带，
     *
     * @return RequestInterceptor 实例，用于拦截请求并添加用户信息
     */
    @Bean
    public RequestInterceptor userInfoRequestInterceptor() {
        return new RequestInterceptor() {
            @Override
            public void apply(RequestTemplate requestTemplate) {
                // 获取当前用户上下文中的用户ID和角色信息
                Long userId = UserContext.get().getUserId();
                String roles = UserContext.get().getRoles();

                // 如果用户ID不为空，则将其添加到请求头中
                if (userId != null) {
                    requestTemplate.header(UserConstants.USER_INFO_USER_ID, userId.toString());
                }

                // 如果角色信息不为空，则将其添加到请求头中
                if (StrUtil.isNotBlank(roles)) {
                    requestTemplate.header(UserConstants.USER_INFO_ROLES, roles);
                }
            }
        };
    }


}